builderparser: Keep properties in a GPtrArray
authorTimm Bäder <mail@baedert.org>
Wed, 6 Jan 2021 18:07:44 +0000 (19:07 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 17 Jan 2021 03:39:26 +0000 (04:39 +0100)
gtk/gtkbuilder.c
gtk/gtkbuilderparser.c
gtk/gtkbuilderprivate.h

index d3edc4d0da67117c10274ae5866ce9b22894fa79..fc090c34d697e9e12a6d8c659d60c941ae1ce117 100644 (file)
@@ -527,19 +527,21 @@ static void
 gtk_builder_get_parameters (GtkBuilder         *builder,
                             GType               object_type,
                             const char         *object_name,
-                            GSList             *properties,
+                            GPtrArray          *properties,
                             GParamFlags         filter_flags,
                             ObjectProperties   *parameters,
                             ObjectProperties   *filtered_parameters)
 {
   GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder);
-  GSList *l;
   DelayedProperty *property;
   GError *error = NULL;
 
-  for (l = properties; l; l = l->next)
+  if (!properties)
+    return;
+
+  for (guint i = 0; i < properties->len; i++)
     {
-      PropertyInfo *prop = (PropertyInfo*)l->data;
+      PropertyInfo *prop = g_ptr_array_index (properties, i);
       const char *property_name = g_intern_string (prop->pspec->name);
       GValue property_value = G_VALUE_INIT;
 
index b22cb1dfe56a2c51086292e7ab26a725657dfb1a..4009307af795c5d41fa3f3af5db83e7f8b51711b 100644 (file)
@@ -471,8 +471,6 @@ builder_construct (ParserData  *data,
   if (object_info->object && object_info->applied_properties)
     return object_info->object;
 
-  object_info->properties = g_slist_reverse (object_info->properties);
-
   if (object_info->object == NULL)
     {
       object = _gtk_builder_construct (data->builder, object_info, error);
@@ -800,18 +798,19 @@ free_object_info (ObjectInfo *info)
   /* Do not free the signal items, which GtkBuilder takes ownership of */
   g_type_class_unref (info->oclass);
   g_slist_free (info->signals);
-  g_slist_free_full (info->properties, (GDestroyNotify)free_property_info);
+  if (info->properties)
+    g_ptr_array_free (info->properties, TRUE);
   g_free (info->constructor);
   g_free (info->id);
   g_slice_free (ObjectInfo, info);
 }
 
 static void
-parse_child (ParserData   *data,
-             const char   *element_name,
+parse_child (ParserData  *data,
+             const char  *element_name,
              const char **names,
              const char **values,
-             GError      **error)
+             GError     **error)
 
 {
   ObjectInfo* object_info;
@@ -1707,7 +1706,6 @@ parse_custom (GtkBuildableParseContext  *context,
       ObjectInfo* object_info = (ObjectInfo*)parent_info;
       if (!object_info->object)
         {
-          object_info->properties = g_slist_reverse (object_info->properties);
           object_info->object = _gtk_builder_construct (data->builder,
                                                         object_info,
                                                         error);
@@ -1885,7 +1883,10 @@ end_element (GtkBuildableParseContext  *context,
               g_string_assign (prop_info->text, translated);
             }
 
-          object_info->properties = g_slist_prepend (object_info->properties, prop_info);
+          if (G_UNLIKELY (!object_info->properties))
+            object_info->properties = g_ptr_array_new_with_free_func ((GDestroyNotify)free_property_info);
+
+          g_ptr_array_add (object_info->properties, prop_info);
         }
       else
         g_assert_not_reached ();
index 74c688b2def0d236dc626a55635587aa1a5086e9..f86aaea629560b528aad16a830c55d239ffb78eb 100644 (file)
@@ -46,9 +46,11 @@ typedef struct {
   GObjectClass *oclass;
   char *id;
   char *constructor;
-  GSList *properties;
+
+  GPtrArray *properties;
   GSList *signals;
   GSList *bindings;
+
   GObject *object;
   CommonInfo *parent;
   gboolean applied_properties;